package com.tdd;

import static org.junit.Assert.assertEquals;

import java.math.BigDecimal;

import org.junit.Before;
import org.junit.Test;

public class RpnCalculatorTest {
	private RpnCalculator rpnCalculator;

	@Before
	public void init() {
		rpnCalculator = new RpnCalculator();
	}
	
	@Test
	public void subtractTwoNumbers() {
		rpnCalculator.push(new BigDecimal(4));
		rpnCalculator.push(new BigDecimal(-7));
		rpnCalculator.minus();
		assertEquals(11, rpnCalculator.peek());
	}
	
	@Test
	public void factorialOf5Is120() {
		rpnCalculator.push(new BigDecimal(5));
		rpnCalculator.factorial();
		assertEquals(120, rpnCalculator.peek());
	}
	
	@Test(expected=RuntimeException.class)
	public void factorialOfNegativeOneGeneratesException() {
		rpnCalculator.push(new BigDecimal(-1));
		rpnCalculator.factorial();
	}
	
	@Test
	public void factorialOf1Is1() {
		rpnCalculator.push(BigDecimal.ONE);
		rpnCalculator.factorial();
		assertEquals(1, rpnCalculator.peek());
	}
	
	@Test
	public void factorialOf0Is0() {
		rpnCalculator.push(BigDecimal.ZERO);
		rpnCalculator.factorial();
		assertEquals(0, rpnCalculator.peek());
	}
	
	@Test
	public void addOneNumber() {
		rpnCalculator.push(new BigDecimal(4));
		rpnCalculator.plus();
		assertEquals(4, rpnCalculator.peek());
	}
	
	@Test
	public void addTwoNumbers() {
		rpnCalculator.push(new BigDecimal(4));
		rpnCalculator.push(new BigDecimal(-7));
		rpnCalculator.plus();
		assertEquals(-3, rpnCalculator.peek());
	}
	
	@Test
	public void newlyCreatedCalcualtorHas0Value() {
		assertEquals(0, rpnCalculator.peek());
	}
	
	@Test
	public void numbersEnteredAreReturnedLifo() {
		rpnCalculator.push(new BigDecimal(3));
		rpnCalculator.push(new BigDecimal(2));
		rpnCalculator.push(new BigDecimal(1));
		
		assertEquals(BigDecimal.ONE, rpnCalculator.pop());
		assertEquals(2, rpnCalculator.pop());
		assertEquals(3, rpnCalculator.pop());
	}
}
